package com.cskaoyan.javase.oop3._0abstract._3exercise;

import com.sun.org.apache.bcel.internal.classfile.Code;

/**
 * 编码练习
 * 公司正在开发一套员工管理系统，需要对公司内部存在的员工进行管理
 * 公司将员工分为三类，普通员工负责杂项工作，程序员负责技术开发，经理负责统筹规划
 * 普通员工包含3个属性：姓名、工号以及工资，行为是工作
 * 程序员包含3个属性：姓名、工号以及工资，行为是工作和加班（overtime work）
 * 经理包含4个属性：姓名、工号、工资以及奖金（bonus），行为是工作
 * 请使用所学的知识设计该员工系统
 * 要求类中提供必要的方法进行属性访问（description）
 *
 * 用普通员工作为父类,在短期是可行的,但有两个问题:
 *      1.长远看,如果普通员工修改了,会影响到其他两种员工,这不合理
 *      2.普通员工终究需要创建对象,但如果定义抽象父类,就有抽象方法来表示强制约束
 * 总之,需要用一个抽象的员工类,作为顶层父类,它不创建对象,也不存这种员工,用它做父类更合适
 *
 *
 * @since 15:41
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 测试多态
        BaseStaff bs;
        bs = new NormalStaff("张三", 10, 10000);
        bs.work();
        bs.print();
        bs = new Coder("李四", 20, 100000);
        bs.work();
        bs.print();
        // 强转之前,先用instanceof判断一下
        if (bs instanceof Coder) {
            Coder c = (Coder) bs;
            c.overtimeWork();
        }
        bs = new Manager("麻子", 30, 100, 200);
        bs.work();
        bs.print();


    }
}

abstract class BaseStaff {
    private String name;
    private int id;
    private double salary;

    // 工作,抽象方法
    public abstract void work();

    public BaseStaff(String name, int id, double salary) {
        this.name = name;
        this.id = id;
        this.salary = salary;
    }

    /*
        父类中提供一个方法,用于属性的访问
        普通员工和程序员可以共用这个方法现实
        但是经理需要自己重写实现
     */
    public void print() {
        System.out.println("这个员工的id是" + id + ",姓名是" + name + ",Ta的工资是" + salary);
    }

    public String getName() {
        return name;
    }

    public int getId() {
        return id;
    }

    public double getSalary() {
        return salary;
    }
}

// 普通员工类
class NormalStaff extends BaseStaff {
    @Override
    public void work() {
        System.out.println("负责杂项工作");
    }

    public NormalStaff(String name, int id, double salary) {
        super(name, id, salary);
    }
}

// 程序员类
class Coder extends BaseStaff {
    @Override
    public void work() {
        System.out.println("负责技术开发");
    }

    public void overtimeWork() {
        System.out.println("我负责996!");
    }

    public Coder(String name, int id, double salary) {
        super(name, id, salary);
    }
}

// 经理类
class Manager extends BaseStaff {
    private double bonus;

    @Override
    public void work() {
        System.out.println("负责统筹规划");
    }

    public Manager(String name, int id, double salary, double bonus) {
        super(name, id, salary);
        this.bonus = bonus;
    }

    @Override
    public void print() {
        System.out.println("这个员工的id是" + getId() + ",姓名是" + getName() + ",Ta的工资是" + (getSalary() + bonus));
    }
}